﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using Montana.DAC;
using System.Data;

namespace Montana.Entidades
{
    public class Cliente : Datos<Cliente>
    {
        public string Codigo { get; set; }
        public string Direccion { get; set; }
        public string Telefono { get; set; }
        public string EMail { get; set; }
        public int IDLocalidad { get; set; }
        public string Localidad { get; set; }
        public int IDProvincia { get; set; }
        public string Provincia { get; set; }
        public int IDCondicioniva { get; set; }
        public string Condicioniva { get; set; }
        public string LetraFactura { get; set; }
        public string IVADiscriminado { get; set; }
        public int IDTipocliente { get; set; }
        public string Tipocliente { get; set; }
        public double Bonificacion { get; set; }
        public string Contacto { get; set; }
        public string CUIT { get; set; }
        public decimal Saldo { get; set; }
        public decimal Saldokg { get; set; }
        public decimal Saldo2 { get; set; }
        public decimal Saldokg2 { get; set; }

        public string Nombrefantasia { get; set; }
        public string Direccionfiscal { get; set; }
        public int IDLocalidadfiscal { get; set; }
        public string Localidadfiscal { get; set; }
        public int IDProvinciafiscal { get; set; }
        public string Provinciafiscal { get; set; }
        public string Expreso { get; set; }
        public string Horarioatencion { get; set; }
        public decimal Precioresago { get; set; }

        public decimal Porcentajeiva { get; set; }

        protected override string SQLBasico
        {
            get
            {
                return @"select c.*, l.nombre as localidad, l.idprovincia, p.nombre as provincia, 
                        ci.nombre as condicioniva, ci.letrafactura, ci.ivadiscriminado, ci.porcentajeIVA, 
                        tc.nombre as tipocliente, tc.bonificacion,
                        l2.nombre as localidadfiscal, p2.nombre as provinciafiscal, p2.id as idprovinciafiscal
                        from ((((((cliente c left join localidad l on c.idlocalidad=l.id)
                            left join provincia p on l.idprovincia=p.id)
                            left join condicioniva ci on c.idcondicioniva=ci.id)
                            left join tipocliente tc on c.idtipocliente=tc.id)
                            left join localidad l2 on c.idlocalidadfiscal=l2.id)
                            left join provincia p2 on l2.idprovincia=p2.id)";
            }
        }

        public string SaldoFormato
        {
            get
            {
                return Saldo.ToString("0.00");
            }
        }

        public void Nuevo()
        {
            Conectar();

            string sql = @"insert into cliente (codigo, nombre, direccion, telefono, email, contacto, 
                        idlocalidad, idcondicioniva, idtipocliente, cuit, nombrefantasia, direccionfiscal,
                        idlocalidadfiscal, expreso, horarioatencion, precioresago, saldo, saldo2, saldoKg, saldoKg2) 
                        values (@codigo, @nombre, @direccion, @telefono, @email, @contacto, 
                            @idlocalidad, @idcondicioniva, @idtipocliente, @cuit, @nombrefantasia, @direccionfiscal,
                        @idlocalidadfiscal, @expreso, @horarioatencion, @precioresago, @saldo, @saldo2, @saldoKg, @saldoKg2)";

            Ejecutar(sql, this);
            
            Desconectar();
        }

        public void Modificar()
        {
            Conectar();

            string sql = @"update cliente set codigo=@codigo, nombre=@nombre, direccion=@direccion, 
                        telefono=@telefono, email=@email, contacto=@contacto, idlocalidad=@idlocalidad, 
                        idcondicioniva=@idcondicioniva, idtipocliente=@idtipocliente, cuit=@cuit,
                        nombrefantasia=@nombrefantasia, direccionfiscal=@direccionfiscal, idlocalidadfiscal=@idlocalidadfiscal, 
                        expreso=@expreso, horarioatencion=@horarioatencion, precioresago=@precioresago, saldo=@saldo,
                        saldo2=@saldo2, saldokg=@saldokg, saldokg2=@saldokg2
                        where id=@id";

            Ejecutar(sql, this);

            Desconectar();
        }

        public bool ExisteCodigo(string codigo)
        {
            DataSet ds = TraerDataSet("select id from cliente where codigo=@codigo", codigo);

            if (ds.Tables[0].Rows.Count == 0)
                return false;
            else
                return true;
        }

        public override Cliente BuscarPorID(int id)
        {
            return BuscarPorID(SQLBasico + " where c.id=@id", id);
        }

        public List<Cliente> BuscarPorNombre(string nombre)
        {
            return TraerObjetos(SQLBasico + " where c.nombre like '" + nombre + "%'");
        }

        public List<Cliente> BuscarPorCodigo(string codigo)
        {
            return TraerObjetos(SQLBasico + " where c.codigo='" + codigo + "'");
        }

        public void BorrarPorCodigo(string codigo)
        {
            Ejecutar("delete from cliente where codigo='" + codigo + "'");
        }

        public void GuardarCliente(string nombre, string codigo, string direccion, string telefono, string email, string idLocalidad, string contacto, string CUIT, string idCondicionIVA)
        {
            idLocalidad = idLocalidad == "" ? "NULL" : idLocalidad;
            idCondicionIVA = idCondicionIVA == "" ? "NULL" : idCondicionIVA;
            nombre = nombre.Replace("'", "''");
            direccion = direccion.Replace("'", "''");

            string sql = @"insert into cliente (nombre, codigo, direccion, telefono, email, idlocalidad, contacto, cuit, idcondicioniva)
                    values ('" + nombre + "', '" + codigo + "', '" + direccion + "', '" + telefono + "', '" + email + "', " + idLocalidad + ", '" + contacto + "', '" + CUIT + "', " + idCondicionIVA + ")";

            Ejecutar(sql);
        }

        public decimal ObtenerSaldo(int idCliente)
        {
            return (decimal)TraerValor("select saldo from cliente where id=@id", idCliente);
        }

        public decimal ObtenerSaldoKG(int idCliente)
        {
            return (decimal)TraerValor("select saldoKG from cliente where id=@id", idCliente);
        }

        public decimal ObtenerSaldo2(int idCliente)
        {
            return (decimal)TraerValor("select saldo2 from cliente where id=@id", idCliente);
        }

        public decimal ObtenerSaldoKg2(int idCliente)
        {
            return (decimal)TraerValor("select saldoKG2 from cliente where id=@id", idCliente);
        }
    }
}
